package com.hsurosy.hsuchain.nft.api.collection.model;

import com.hsurosy.hsuchain.nft.api.collection.constant.CollectionStateEnum;
import com.hsurosy.hsuchain.nft.api.collection.constant.CollectionVoState;
import lombok.Data;

import java.math.BigDecimal;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Date;

/**
 * 藏品信息类
 *
 * @Author Hsu琛君珩
 * @Date 2024-10-04 14:33
 * @Description
 * @Version: v1.0.0
 */
@Data
public class CollectionVO extends BaseGoodsVO {

    /**
     * 主键ID
     */
    private Long id;

    /**
     * 藏品名称
     */
    private String name;

    /**
     * 藏品封面
     */
    private String cover;

    /**
     * 藏品类目ID
     */
    private String classId;

    /**
     * 价格
     */
    private BigDecimal price;

    /**
     * 藏品数量
     */
    private Long quantity;

    /**
     * 库存
     */
    private Long inventory;

    /**
     * 状态
     */
    private CollectionVoState state;

    /**
     * 藏品创建时间
     */
    private Date createTime;

    /**
     * 藏品发售时间
     */
    private Date saleTime;

    /**
     * 藏品上链时间
     */
    private Date syncChainTime;

    /**
     * 版本
     */
    private Integer version;

    /**
     * 默认最小开售时间为60分钟
     */
    public static final int DEFAULT_MIN_SALE_TIME = 60;

    /**
     * 设置藏品状态
     * 根据当前状态、发售时间和可售库存来设置藏品的展示状态。
     * 当藏品未发售且时间小于1天时为即将开售，大于1天为等待开售，发售后有库存为售卖中，无库存为售空。
     *
     * @param state 当前藏品状态
     * @param saleTime 发售时间
     * @param saleableInventory 可售库存
     */
    public void setState(CollectionStateEnum state, Date saleTime, Long saleableInventory) {
        // 如果藏品状态为未处理或已下架，设置为不可售卖
        if (state.equals(CollectionStateEnum.INIT) || state.equals(CollectionStateEnum.REMOVED)) {
            this.setState(CollectionVoState.NOT_FOR_SALE);
        }
        // 获取当前时间
        Instant now = Instant.now();
        // 如果当前时间大于或等于发售时间，判断库存来决定是否为售卖中或售空
        if (now.compareTo(saleTime.toInstant()) >= 0) {
            if (saleableInventory > 0) {
                this.setState(CollectionVoState.SELLING); // 设置为售卖中
            } else {
                this.setState(CollectionVoState.SOLD_OUT); // 设置为售空
            }
        } else {
            // 如果当前时间小于发售时间，判断距离发售时间来设置状态
            if (ChronoUnit.MINUTES.between(now, saleTime.toInstant()) > DEFAULT_MIN_SALE_TIME) {
                this.setState(CollectionVoState.WAIT_FOR_SALE); // 设置为等待开售
            } else {
                this.setState(CollectionVoState.COMING_SOON); // 设置为即将开售
            }
        }
    }

    @Override
    public String getGoodsName() {
        return this.name;
    }

    @Override
    public String getGoodsPicUrl() {
        return this.cover;
    }

    @Override
    public String getSellerId() {
        // 藏品持有人默认是平台，平台ID用0表示
        return "0";
    }

    @Override
    public Integer getVersion() {
        return version;
    }

    @Override
    public Boolean available() {
        return this.state == CollectionVoState.SELLING;
    }

    @Override
    public BigDecimal getPrice() {
        return this.price;
    }
}
